home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 12, No. 10 (1991-10)(MindCraft Publishing)(Side A)[a].zip / Nibble Volume 12, No. 10 (1991-10)(MindCraft Publishing)(Side A)[a].po / AUTOSAVE.S < prev    next >
Text File  |  1996-12-24  |  12KB  |  359 lines

  1. ********************************
  2. *   AUTOSAVE  Source Code      *
  3. *   BY ROBERT T. YUILLE        *
  4. *   COPYRIGHT (C) 1991         *
  5. *   BY MINDCRAFT PUB. CORP.    *
  6. *   CONCORD, MA   01742        *
  7. *                              *
  8. *         MERLIN 8/16          *
  9. ********************************
  10. *
  11. CH        = $24          ; horizontal cursor
  12. CV        = $25          ; vertical cursor
  13. OPLEN     = $2F          ; opcode length
  14. A1L       = $3C          ; mem move start
  15. A2L       = $3E          ; mem move end
  16. A4L       = $42          ; mem move destination
  17. PGMST     = $67          ; BASIC program start
  18. HIMEM     = $73          ; HIMEM location
  19. PGMEND    = $AF          ; BASIC program end
  20. TMP       = $FA          ; temp location
  21. PTR       = $FB          ; pointer
  22. INBUF     = $200         ; input buffer
  23. PFXBUF    = $300         ; Prefix buffer
  24. FNAM      = $350         ; filename buffer
  25. OURCH     = $57B         ; 80-col horiz cursor
  26. KBD       = $C000        ; keyboard
  27. STROBE    = $C010        ; keyboard strobe
  28. RD80COL   = $C01F        ; read 80/40 display switch
  29. CHKOPLEN  = $F88E        ; check opcode length
  30. TABV      = $FB5B        ; set vertical cursor
  31. UP        = $FC1A        ; move cursor up a line
  32. CLREOL    = $FC9C        ; clear to end of line
  33. GETLN1    = $FD6F        ; get input line
  34. CROUT     = $FD8E        ; CR out
  35. COUT      = $FDED        ; character out
  36. MOVE      = $FE2C        ; move memory
  37. *
  38. TBUF      = $BCBC        ; temp pathname buffer
  39. EXTRNCMD  = $BE06        ; external command hook
  40. ERROUT    = $BE09        ; error handler
  41. XRETURN   = $BE9E        ; known RTS
  42. XTRNADDR  = $BE50        ; external command address
  43. XLEN      = $BE52        ; external cmd length-1
  44. XCNUM     = $BE53        ; basic command no. (0-ext)
  45. PBITS     = $BE54        ; parameter bits allowed
  46. GOSYSTEM  = $BE70        ; execute MLI call
  47. CRACESS   = $BEA3        ; access code
  48. CRFILID   = $BEA4        ; file_type
  49. CRAUXID   = $BEA5        ; aux_type
  50. CRFKIND   = $BEA7        ; storage_type
  51. SSGINFO   = $BEB4        ; Get/Set info parm count
  52. FIMDATE   = $BEBE        ; modification date
  53. SREFNUM   = $BEC7        ; SEOF ref. number
  54. SUNITNUM  = $BEC7        ; device slot & drive no.
  55. SBUFADR   = $BEC8        ; ON_LINE data buffer
  56. SEOF      = $BEC8        ; EOF data
  57. OSYSBUF   = $BECE        ; I/O buffer
  58. OREFNUM   = $BED0        ; Open ref. number
  59. RWREFNUM  = $BED6        ; Read/Write ref. number
  60. RWDATA    = $BED7        ; Read/Write data pointer
  61. RWCOUNT   = $BED9        ; Read/Write byte count
  62. CFREFNUM  = $BEDE        ; Close ref. number
  63. GETBUFR   = $BEF5        ; allocate buffer
  64. DATM      = $BF90        ; PRODOS Date/Time location
  65. *
  66.           ORG $2000
  67. *
  68.           CLD
  69.           LDA #>END-START+$100
  70.           JSR GETBUFR    ; set HIMEM
  71.           BCC :1
  72.           JMP ERROUT     ; handle error
  73. :1        STA TMP        ; save location
  74.           LDX #0
  75. :2        LDA IMSG,X     ; installed message
  76.           BEQ MODCD
  77.           JSR COUT
  78.           INX
  79.           BNE :2
  80. MODCD     LDA #<START
  81.           STA PTR        ; set program pointer
  82.           LDA #>START
  83.           STA PTR+1
  84. MODLP     LDY #0
  85.           LDA (PTR),Y    ; get opcode
  86.           JSR CHKOPLEN   ; check length
  87.           LDY OPLEN      ; put length in Y-reg
  88.           CPY #2         ; 2=3 byte instruction
  89.           BNE NOMOD      ; no modification nec
  90.           LDA (PTR),Y    ; get HOB
  91.           CMP #>START    ; below program?
  92.           BCC NOMOD      ; yes
  93.           CMP #>MODEND+$100 ; above program?
  94.           BCS NOMOD      ; yes
  95. FIX       SEC
  96.           SBC #>START    ; subtract min. location
  97.           CLC
  98.           ADC TMP        ; add new address
  99.           STA (PTR),Y    ; save new byte
  100. NOMOD     INY
  101.           TYA
  102.           CLC
  103.           ADC PTR        ; advance
  104.           STA PTR        ; pointer
  105.           BCC DONE
  106.           INC PTR+1
  107. DONE      LDA PTR+1
  108.           CMP #>MODEND   ; check HOB
  109.           BCC MODLP
  110.           LDA PTR
  111.           CMP #<MODEND   ; end of program?
  112.           BCC MODLP      ; no
  113. *
  114.           LDA EXTRNCMD+1 ; position current
  115.           STA NXTCMD+1   ; external command
  116.           LDA EXTRNCMD+2
  117.           STA NXTCMD+2
  118.           LDA #0
  119.           STA FNAM       ; zero filename
  120.           STA A4L        ; set mem destination
  121.           STA EXTRNCMD+1 ; and command
  122.           LDA TMP        ; location
  123.           STA EXTRNCMD+2
  124.           STA A4L+1
  125. *
  126.           LDA #<START    ; set mem start
  127.           STA A1L
  128.           LDA #>START
  129.           STA A1L+1
  130.           LDA #<END      ; and mem end
  131.           STA A2L        ; addresses
  132.           LDA #>END
  133.           STA A2L+1
  134.           LDY #0
  135.           JSR MOVE       ; move memory
  136.           CLC
  137.           RTS            ; return to BASIC
  138. *
  139. IMSG      HEX 8D
  140.           ASC "AutoSave Installed!",8D8D00
  141.           LST OFF
  142.           DS \
  143.           LST ON
  144. *
  145. START     CLD
  146.           LDA INBUF      ; check input buffer
  147.           CMP #"S"       ; for our command
  148.           BNE :1
  149.           CMP #"s"       ; check lowercase
  150.           BNE :1
  151.           LDA INBUF+1
  152.           CMP #$8D
  153.           BEQ OURS
  154. :1        SEC            ; flag not our command
  155. NXTCMD    JMP $0000      ; link to next command
  156. OURS      LDA #0
  157.           STA XLEN       ; command length-1
  158.           STA XCNUM      ; external command
  159.           STA PBITS      ; no parsing
  160.           STA PBITS+1
  161.           LDA #<XRETURN  ; set to
  162.           STA XTRNADDR   ; known RTS
  163.           LDA #>XRETURN
  164.           STA XTRNADDR+1
  165.           JSR CROUT
  166. GTPFX     LDA #$C7       ; GET_PREFIX command
  167.           JSR GOSYSTEM   ; get the Prefix
  168.           BCS ER1        ; handle error
  169.           LDA TBUF       ; system Prefix set?
  170.           BNE CKFNM      ; yes
  171. GTVLNM    LDA #$60       ; slot 6, drive 1
  172.           STA SUNITNUM   ; set unit number
  173.           LDA #<PFXBUF   ; set location of
  174.           STA SBUFADR    ; Prefix storage
  175.           LDA #>PFXBUF   ; buffer
  176.           STA SBUFADR+1
  177.           LDA #$C5       ; ON_LINE command
  178.           JSR GOSYSTEM   ; get Volume name
  179.           BCS ER1
  180. STPFX     LDA PFXBUF     ; get first byte
  181.           AND #%00001111 ; isolate length info
  182.           TAY            ; save in Y-reg
  183.           LDA #'/'       ; start with slash
  184.           LDX #0
  185. :1        INX
  186.           STA TBUF,X     ; store name character
  187.           LDA PFXBUF,X   ; get next name char
  188.           DEY            ; reduce counter
  189.           BPL :1         ; loop for another char
  190.           STX TBUF       ; length byte
  191.           LDA #$C6       ; SET_PREFIX command
  192.           JSR GOSYSTEM   ; set Prefix in PRODOS
  193.           BCS ER1
  194. CKFNM     JSR CROUT
  195.           JSR UP
  196.           LDA FNAM       ; current filename set?
  197.           BNE SV4        ; yes
  198.           LDX #0
  199. SV1       LDA MSG1,X     ; print enter
  200.           BEQ SV2        ; filename
  201.           JSR COUT       ; message
  202.           INX
  203.           BNE SV1
  204. SV2       JSR GETLN1     ; get input
  205.           LDX #$FF
  206. :1        INX
  207.           LDA INBUF,X    ; get char from buffer
  208.           CMP #$8D       ; end of input?
  209.           BEQ SV3        ; yes
  210.           ORA #$80       ; convert to positive ASCII
  211.           STA FNAM+1,X   ; store in filename location
  212.           CPX #64        ; max length of 64
  213.           BNE :1
  214.           LDA #16        ; SYNTAX error
  215. ER1       JMP ERROUT
  216. SV3       STX FNAM       ; filename length
  217.           JMP OPEN       ; open file
  218. SV4       LDX #0         ; print
  219. :1        LDA MSG2,X     ; save as
  220.           BEQ :2         ; message
  221.           JSR COUT
  222.           INX
  223.           BCC :1
  224. :2        LDA CV
  225.           STA TMP
  226.           LDX #0
  227. :3        INX
  228.           LDA FNAM,X     ; print
  229.           ORA #$80       ; filename
  230.           JSR COUT
  231.           CPX FNAM
  232.           BCC :3
  233.           LDA #'?'       ; print inverse
  234.           JSR COUT       ; question mark
  235. :4        LDA KBD        ; wait for
  236.           BPL :4         ; keypress
  237.           PHA
  238.           BIT RD80COL    ; 80 col?
  239.           BMI :6         ; yes
  240.           LDA CH
  241.           BNE :5
  242.           LDA TMP
  243.           JSR TABV
  244.           LDA #39
  245.           STA CH
  246.           BNE :7
  247. :5        DEC CH
  248.           JMP :7
  249. :6        DEC OURCH
  250. :7        JSR CLREOL     ; clear question mark
  251.           PLA
  252.           CMP #"Y"       ; uppercase Y?
  253.           BEQ :9         ; yes
  254.           CMP #"y"       ; lowercase y?
  255.           BEQ :9         ; yes
  256.           CMP #$8D       ; CR?
  257.           BEQ :9         ; yes
  258.           CMP #$9B       ; Escape key?
  259.           BNE :8         ; no
  260.           BIT STROBE     ; strobe keyboard
  261.           JMP RTN        ; and return to BASIC
  262. :8        LDA TMP
  263.           JSR TABV
  264.           LDA #9         ; set
  265.           STA CH         ; cursor to
  266.           STA OURCH      ; beginning of filename
  267.           JMP SV2        ; and get new input
  268. :9        BIT STROBE
  269. OPEN      JSR LDFNAM     ; put filename in TBUF
  270.           LDA HIMEM+1    ; address of all-purpose buffer
  271.           STA OSYSBUF+1  ; set open I/O buffer
  272.           LDA #0
  273.           STA OSYSBUF
  274.           LDA #$C8       ; OPEN command
  275.           JSR GOSYSTEM   ; open the file
  276.           BCC STEOF      ; file opened
  277.           CMP #6         ; path not found
  278.           BEQ CREATE     ; so create file
  279.           CMP #7
  280.           BNE ER2        ; other errors
  281. CREATE    LDA #$E3       ; file access code
  282.           STA CRACESS
  283.           LDA #$FC       ; Applesoft program file
  284.           STA CRFILID
  285.           LDA #1         ; standard file
  286.           STA CRFKIND
  287.           STA CRAUXID    ; LOB of load address
  288.           LDA #8
  289.           STA CRAUXID+1  ; HOB of load address
  290.           JSR LDFNAM
  291.           LDA #$C0       ; CREATE command
  292.           JSR GOSYSTEM   ; create file
  293.           BCC OPEN       ; go back and open file
  294. ER2       JMP ERROUT
  295. STEOF     LDA OREFNUM    ; copy open ref number
  296.           STA SREFNUM    ; to set eof
  297.           STA RWREFNUM   ; read/write
  298.           STA CFREFNUM   ; and close parm lists
  299.           LDA #0
  300.           STA SEOF       ; set EOF to 0
  301.           STA SEOF+1
  302.           STA SEOF+2
  303.           LDA #$D0       ; SET_EOF command
  304.           JSR GOSYSTEM   ; set EOF
  305.           BCS ER2
  306. WRITE     LDA PGMST      ; set data address
  307.           STA RWDATA     ; pointer to start
  308.           LDA PGMST+1    ; of Applesoft program
  309.           STA RWDATA+1
  310.           SEC
  311.           LDA PGMEND     ; set write byte count
  312.           SBC PGMST      ; to length of
  313.           STA RWCOUNT    ; program
  314.           SEC
  315.           LDA PGMEND+1
  316.           SBC PGMST+1
  317.           STA RWCOUNT+1
  318.           LDA #$CB       ; WRITE command
  319.           JSR GOSYSTEM   ; xfer data to disk
  320.           BCS ER2
  321. CLOSE     LDA #$CC       ; CLOSE command
  322.           JSR GOSYSTEM   ; close file
  323.           BCS ER2
  324. GFLIN     JSR LDFNAM
  325.           LDA #$0A       ; parm count for GFI call
  326.           STA SSGINFO
  327.           LDA #$C4       ; GET_FILE_INFO command
  328.           JSR GOSYSTEM   ; fill GFI parm list
  329.           BCS ER2
  330. SFLIN     JSR LDFNAM
  331.           LDA #$07       ; parm count for SFI call
  332.           STA SSGINFO
  333.           LDA DATM       ; set new
  334.           STA FIMDATE    ; modification date
  335.           LDA DATM+1
  336.           STA FIMDATE+1
  337.           LDA #$C3       ; SET_FILE_INFO command
  338.           JSR GOSYSTEM   ; set new date
  339.           BCS ER2
  340.           JSR CROUT
  341. RTN       CLC
  342.           RTS
  343. *
  344. LDFNAM    LDX #0
  345.           LDA FNAM       ; get length byte
  346.           STA TBUF       ; store in TBUF
  347. :1        INX
  348.           LDA FNAM,X     ; xfer filename
  349.           STA TBUF,X     ; to TBUF
  350.           CPX FNAM
  351.           BCC :1
  352.           RTS
  353. MODEND    = *
  354. *
  355. MSG1      ASC "ENTER FILENAME: ",00
  356. MSG2      ASC "SAVE AS: ",00
  357. END       = *
  358.           LST OFF
  359.